#ifndef SCENE_MANAGER_H
#define SCENE_MANAGER_H

#include "common.h"
#include "database/db_manager.h"
#include "scene_types.h"

// 场景定义
typedef struct scene {
    int id;                           // 场景ID
    char *name;                       // 场景名称
    char *type;                       // 场景类型
    char *description;                // 场景描述
    bool enabled;                     // 是否启用
    trigger_mode_t trigger_mode;      // 触发方式
    action_type_t action_type;        // 动作类型
    bool time_management;             // 启用时间管理
    char *notification_method;        // 通知方式
    char *notification_config;        // 通知配置

    // 触发条件
    json_t *trigger_condition;        // 触发条件JSON数组

    // 执行动作
    json_t *actions;                  // 执行动作JSON数组

    // 生效时间
    effective_time_t effective_time;  // 生效时间配置

    // 运行时状态
    scene_status_t status;            // 当前状态
    time_t last_triggered;            // 最后触发时间
    time_t last_executed;             // 最后执行时间
    int execution_count;              // 执行次数

    struct scene *next;
} scene_t;

// 场景管理器
typedef struct {
    scene_t *scenes;                  // 场景链表
    pthread_rwlock_t rwlock;          // 读写锁
    db_manager_t *db_mgr;             // 数据库管理器
    event_loop_t *event_loop;         // 事件循环
    timer_manager_t *timer;           // 定时器管理器
    data_pool_t *data_pool;           // 数据池
    bool initialized;
} scene_manager_t;

// 场景事件类型
typedef enum {
    EVENT_SCENE_TRIGGERED,           // 场景被触发
    EVENT_SCENE_EXECUTED,            // 场景执行完成
    EVENT_SCENE_FAILED,              // 场景执行失败
    EVENT_SCENE_STATUS_CHANGED       // 场景状态变化
} scene_event_type_t;

// 场景事件数据
typedef struct {
    int scene_id;
    scene_event_type_t event_type;
    char *scene_name;
    trigger_mode_t trigger_mode;
    action_type_t action_type;
    json_t *additional_data;
} scene_event_data_t;

// 场景管理器API
int scene_manager_init(scene_manager_t *manager, db_manager_t *db_mgr,
                       event_loop_t *event_loop, timer_manager_t *timer,
                       data_pool_t *data_pool);
int scene_manager_load_scenes(scene_manager_t *manager);
int scene_manager_add_scene(scene_manager_t *manager, scene_t *scene);
int scene_manager_remove_scene(scene_manager_t *manager, int scene_id);
int scene_manager_update_scene(scene_manager_t *manager, scene_t *scene);
scene_t *scene_manager_find_scene(scene_manager_t *manager, int scene_id);
scene_t *scene_manager_find_scene_by_name(scene_manager_t *manager, const char *name);
int scene_manager_trigger_scene(scene_manager_t *manager, int scene_id, const char *trigger_source);
int scene_manager_enable_scene(scene_manager_t *manager, int scene_id, bool enable);
void scene_manager_destroy(scene_manager_t *manager);

// 场景触发检查
int scene_manager_check_value_triggers(scene_manager_t *manager, const char *data_key, json_t *new_value);
int scene_manager_setup_timer_triggers(scene_manager_t *manager);

// 时间管理检查
bool scene_manager_check_effective_time(scene_t *scene);

// 工具函数
scene_t *scene_create(void);
void scene_free(scene_t *scene);
const char *scene_status_to_string(scene_status_t status);
const char *trigger_mode_to_string(trigger_mode_t mode);
const char *action_type_to_string(action_type_t type);

// 数据库操作
int scene_manager_save_scene_to_db(scene_manager_t *manager, scene_t *scene);
int scene_manager_delete_scene_from_db(scene_manager_t *manager, int scene_id);

#endif
